"""
TODO 1、概述：

    触发器：是一种特殊的存储过程，无需调用，当对数据库表中的数据执行DML（增删改）操作时自动触发这个SQL片段的执行
          在MySQL中，只有执行insert、delete、update时才会触发触发器的执行
          这种特性可以协助应用在数据库端确保数据的完整性、日志记录、数据校验等操作
          使用别名OLD和NEW来引用触发器中发生变化的记录内容（这与其他数据库相似）
          目前触发器只支持行级触发，不支持语句级触发

    特性：什么条件会触发（I、D、U）
         什么时候触发（在增删改之前还是之后）
         触发频率（针对每一行执行）
         触发器定义在一张表上，附着在另一张表上

    注意：触发频率设定之后，附着在另一张表的内容只能输入一行，需要输入多行，可借助 delimiter
         尽量少使用触发器，效率低，可用python等语言代替

TODO 2、基本操作：

       drop trigger trigger_test1;
       truncate table user;

       use test1;

       create table user(                   -- 用户表
       uid int primary key,
       username varchar(20) not null,
       password varchar(20) not null
       );

       create table user_logs(            -- 用户信息操作日志表
       id int primary key auto_increment,
       time timestamp,
       log_txt varchar(255)
       );

    -- 需求1：当user 表添加一行数据，则自动在user_logs 添加日志记录
       create trigger trigger_test1 after insert
       on user for each row
       insert into user_logs values(NULL,now(),'有新用户添加');
       insert into user_logs values(NULL,now(),concat_ws(',','有新用户添加，添加之前信息为：',OLD.uid,OLD.username,OLD.password));
       insert into user_logs values(NULL,now(),concat_ws(',','有新用户添加，添加之后信息为：',NEW.uid,NEW.username,NEW.password));

       insert into user values(1,'张三','123456');
       insert into user values(2,'李四','234567'),(3,'王五','345678');  -- 在user表添加多条数据，让触发器自动执行，user_logs表会跟着自动填充多行数据

    -- 需求2：当user 表被修改时，则自动在user_logs 添加日志记录
       delimiter &&
       create trigger trigger_test2 before update
       on user for each row
       begin
         insert into user_logs values(NULL,now(),'有新用户信息被修改');
         insert into user_logs values(NLL,now(),concat_ws(',','有用户信息被修改，修改前信息为：',OLD.uid,OLD.username,OLD.password));
         insert into user_logs values(NLL,now(),concat_ws(',','有用户信息被修改，修改后信息为：',NEW.uid,NEW.username,NEW.password));
       end &&
       delimiter ;

       update user set password = '88888888' where id = 1;

    -- 需求3：当user 表被删除时，则自动在user_logs 添加日志记录
       delimiter &&
       create trigger trigger_test3 before delete
       on user for each row
       begin
         insert into user_logs values(NULL,now(),'有新用户信息被删除');
         insert into user_logs values(NLL,now(),concat_ws(',','有用户信息被删除，删除后信息为：',OLD.uid,OLD.username,OLD.password));
       end &&
       delimiter ;

       delete from user where id = 1;

TODO 3、NEW和OLD

1、格式：
    insert型触发器：NEW表示将要/已新增的数据
    update型触发器：OLD表示修改前的数据，NEW表示将要/已修改后的数据
    delete型触发器：OLD表示将要/已删除的数据

2、用法：见上面部分的代码

3、查看触发器：
    show triggers;
"""